// example_usage.c - 配网管理模块使用示例
#include "app_config.h"
#include "system/includes.h"
#include "wifi/wifi_connect.h"

#include "custom/web/wifi_prov_config.h"
#include "custom/web/wifi_prov_server_simple.h"

// =============== 回调函数示例 ===============

// 状态变化回调
static void example_state_changed_cb(wifi_prov_state_t old_state, wifi_prov_state_t new_state)
{
    printf("[Example] State changed: %d -> %d\n", old_state, new_state);
    
    switch (new_state) {
        case WIFI_PROV_STATE_AP_READY:
            printf("[Example] 设备已进入配网模式，请连接热点进行配网\n");
            break;
        case WIFI_PROV_STATE_CONNECTING:
            printf("[Example] 正在连接WiFi...\n");
            break;
        case WIFI_PROV_STATE_CONNECTED:
            printf("[Example] 配网成功！\n");
            break;
        case WIFI_PROV_STATE_FAILED:
            printf("[Example] 配网失败\n");
            break;
        case WIFI_PROV_STATE_TIMEOUT:
            printf("[Example] 配网超时\n");
            break;
    }
}

// 进度回调
static void example_progress_cb(int progress)
{
    printf("[Example] 配网进度: %d%%\n", progress);
}

// 错误回调
static void example_error_cb(wifi_prov_error_t error, const char* message)
{
    printf("[Example] 配网错误: %d - %s\n", error, message ? message : "Unknown");
    
    switch (error) {
        case WIFI_PROV_ERR_TIMEOUT:
            printf("[Example] 配网超时，请重试\n");
            break;
        case WIFI_PROV_ERR_CONNECT_FAILED:
            printf("[Example] 连接失败，请检查WiFi密码\n");
            break;
        case WIFI_PROV_ERR_AP_START_FAILED:
            printf("[Example] AP启动失败，请重启设备\n");
            break;
        default:
            printf("[Example] 未知错误\n");
            break;
    }
}

// 成功回调
static void example_success_cb(const char* ssid)
{
    printf("[Example] 配网成功，已连接到: %s\n", ssid);
}

// 超时回调
static void example_timeout_cb(wifi_prov_timeout_type_t timeout_type)
{
    printf("[Example] 配网超时: %d\n", timeout_type);
}

// =============== 事件桥接示例 ===============

// 配网管理模块 → wifi_app_task 的事件
static void example_start_ap_cb(void)
{
    printf("[Example] 请求启动AP\n");
    // 这里不需要做什么，WiFi事件会自动处理
}

static void example_stop_ap_cb(void)
{
    printf("[Example] 请求停止AP\n");
    // 停止配网服务器
    wifi_prov_server_stop();
}

static void example_connect_sta_cb(const char* ssid, const char* pwd)
{
    printf("[Example] 请求连接STA: %s\n", ssid);
    // 这里应该调用实际的WiFi连接函数
    // wifi_sta_connect((char*)ssid, (char*)pwd, 1);
}

static void example_set_mode_cb(int mode)
{
    printf("[Example] 请求设置模式: %d\n", mode);
    // 这里不需要做什么，WiFi事件会自动处理
}

// wifi_app_task → 配网管理模块 的事件
static void example_ap_started_cb(void)
{
    printf("[Example] AP已启动\n");
    // 启动配网服务器
    wifi_prov_server_start();
}

static void example_ap_stopped_cb(void)
{
    printf("[Example] AP已停止\n");
}

static void example_sta_connected_cb(void)
{
    printf("[Example] STA已连接\n");
}

static void example_sta_disconnected_cb(void)
{
    printf("[Example] STA已断开\n");
}

static void example_wifi_error_cb(int error)
{
    printf("[Example] WiFi错误: %d\n", error);
}

// 配网凭据回调
static void example_credentials_cb(const char* ssid, const char* pwd, int save)
{
    printf("[Example] 收到配网凭据: ssid=%s, save=%d\n", ssid, save);
    // 转发给配网管理模块
    wifi_prov_on_credentials(ssid, pwd, save);
}

// =============== 使用示例 ===============

// 示例1: 基本使用
static void example_basic_usage(void)
{
    printf("\n=== 示例1: 基本使用 ===\n");
    
    // 1. 初始化配网模块
    wifi_prov_config_t config = WIFI_PROV_DEFAULT_CONFIG();
    wifi_prov_init(&config);
    
    // 2. 设置回调
    wifi_prov_callbacks_t callbacks = {
        .on_state_changed = example_state_changed_cb,
        .on_progress = example_progress_cb,
        .on_error = example_error_cb,
        .on_success = example_success_cb,
        .on_timeout = example_timeout_cb
    };
    wifi_prov_set_callbacks(&callbacks);
    
    // 3. 设置事件桥接
    wifi_prov_event_bridge_t bridge = {
        .on_prov_start_ap = example_start_ap_cb,
        .on_prov_stop_ap = example_stop_ap_cb,
        .on_prov_connect_sta = example_connect_sta_cb,
        .on_prov_set_mode = example_set_mode_cb,
        .on_wifi_ap_started = example_ap_started_cb,
        .on_wifi_ap_stopped = example_ap_stopped_cb,
        .on_wifi_sta_connected = example_sta_connected_cb,
        .on_wifi_sta_disconnected = example_sta_disconnected_cb,
        .on_wifi_error = example_wifi_error_cb
    };
    wifi_prov_set_event_bridge(&bridge);
    
    // 4. 设置配网服务器凭据回调
    wifi_prov_server_set_credentials_callback(example_credentials_cb);
    
    // 5. 启动配网
    wifi_prov_start();
}

// 示例2: 自定义配置
static void example_custom_config(void)
{
    printf("\n=== 示例2: 自定义配置 ===\n");
    
    // 自定义配置
    wifi_prov_config_t config = WIFI_PROV_DEFAULT_CONFIG();
    
    // 自定义AP配置
    strcpy(config.ap_ssid_prefix, "MyDevice_");
    strcpy(config.ap_password, "12345678");
    
    // 自定义超时配置
    config.timeouts.wait_credentials_timeout_ms = 600000; // 10分钟
    config.timeouts.connect_timeout_ms = 60000; // 1分钟
    config.max_retry_count = 5;
    
    // 初始化
    wifi_prov_init(&config);
    
    printf("自定义配置完成\n");
}

// 示例3: 状态查询
static void example_status_query(void)
{
    printf("\n=== 示例3: 状态查询 ===\n");
    
    // 检查是否需要配网
    if (wifi_prov_need_provisioning()) {
        printf("需要配网\n");
    } else {
        printf("已配网，正常启动\n");
    }
    
    // 获取配网模式
    wifi_prov_desired_mode_t mode = wifi_prov_get_desired_mode();
    printf("配网模式: %s\n", mode == WIFI_PROV_DESIRED_AP ? "AP" : "STA");
    
    // 获取当前状态
    wifi_prov_state_t state = wifi_prov_get_state();
    printf("当前状态: %d\n", state);
    
    // 获取进度
    int progress = wifi_prov_get_progress();
    printf("配网进度: %d%%\n", progress);
    
    // 获取错误信息
    wifi_prov_error_t error = wifi_prov_get_error();
    if (error != WIFI_PROV_ERR_NONE) {
        const char* error_str = wifi_prov_get_error_string(error);
        printf("错误信息: %s\n", error_str);
    }
    
    // 获取连接的SSID
    const char* ssid = wifi_prov_get_connected_ssid();
    if (ssid && ssid[0]) {
        printf("已连接SSID: %s\n", ssid);
    }
}

// 示例4: 配网服务器控制
static void example_server_control(void)
{
    printf("\n=== 示例4: 配网服务器控制 ===\n");
    
    // 启动服务器
    int ret = wifi_prov_server_start();
    if (ret == 0) {
        printf("配网服务器启动成功\n");
    } else {
        printf("配网服务器启动失败: %d\n", ret);
    }
    
    // 检查服务器状态
    if (wifi_prov_server_is_running()) {
        printf("配网服务器运行中\n");
    } else {
        printf("配网服务器未运行\n");
    }
    
    // 获取服务器状态字符串
    const char* status = wifi_prov_server_get_status_string();
    printf("服务器状态: %s\n", status);
    
    // 停止服务器
    ret = wifi_prov_server_stop();
    if (ret == 0) {
        printf("配网服务器停止成功\n");
    } else {
        printf("配网服务器停止失败: %d\n", ret);
    }
}

// 示例5: 错误处理
static void example_error_handling(void)
{
    printf("\n=== 示例5: 错误处理 ===\n");
    
    // 模拟各种错误情况
    wifi_prov_error_t errors[] = {
        WIFI_PROV_ERR_NONE,
        WIFI_PROV_ERR_INVALID_PARAM,
        WIFI_PROV_ERR_AP_START_FAILED,
        WIFI_PROV_ERR_CREDENTIALS_INVALID,
        WIFI_PROV_ERR_CONNECT_FAILED,
        WIFI_PROV_ERR_TIMEOUT,
        WIFI_PROV_ERR_NETWORK_ERROR,
        WIFI_PROV_ERR_STORAGE_ERROR,
        WIFI_PROV_ERR_SERVER_ERROR
    };
    
    for (int i = 0; i < sizeof(errors) / sizeof(errors[0]); i++) {
        const char* error_str = wifi_prov_get_error_string(errors[i]);
        printf("错误码 %d: %s\n", errors[i], error_str);
    }
}

// 示例6: 恢复出厂设置
static void example_factory_reset(void)
{
    printf("\n=== 示例6: 恢复出厂设置 ===\n");
    
    printf("执行恢复出厂设置...\n");
    int ret = wifi_prov_factory_reset();
    if (ret == 0) {
        printf("恢复出厂设置成功\n");
    } else {
        printf("恢复出厂设置失败: %d\n", ret);
    }
}

// 主函数
void example_main(void)
{
    printf("\n========== 配网管理模块使用示例 ==========\n");
    
    example_basic_usage();
    example_custom_config();
    example_status_query();
    example_server_control();
    example_error_handling();
    example_factory_reset();
    
    printf("\n========== 示例完成 ==========\n");
}

// 在app_main中调用
void app_main()
{
    printf("配网管理模块示例程序启动\n");
    
    // 运行示例
    example_main();
    
    // 实际使用时，应该在这里初始化WiFi和配网模块
    // 参考 wifi_demo_task_v2.c 的完整实现
}
